关于vb.net:将“ Double”或“ Single”转换为“ Integer”的最简单方法,无需四舍五入

您所在的位置:网站首页 vb 取整 关于vb.net:将“ Double”或“ Single”转换为“ Integer”的最简单方法,无需四舍五入

关于vb.net:将“ Double”或“ Single”转换为“ Integer”的最简单方法,无需四舍五入

#关于vb.net:将“ Double”或“ Single”转换为“ Integer”的最简单方法,无需四舍五入 | 来源: 网络整理| 查看: 265

使用CInt或CType将浮点数转换为整数将导致该数字的值四舍五入。 Int函数和Math.Floor可以用于将浮点数转换为整数,向负无穷大舍入,但是这两个函数都返回浮点值,如果不进行强制转换,则不能将其隐式用作Integer值。

是否有IntVar = CInt(Int(FloatingPointVar));的简洁惯用替代品? Pascal包含了Round和Trunc函数,这些函数返回了Integer; VB.NET语言或.NET框架中是否有等同的功能?

一个类似的问题,CInt不能始终如一地舍入Double值-如何删除小数部分?在2011年被问到,但是它只是问是否有一种方法可以将浮点数转换为整数;答案提出了一个分为两个步骤的过程,但是对于框架中存在或不存在的内容并没有深入探讨。我很难相信该框架不会具有类似于Pascal Trunc函数的功能,因为在使用浮点操作数执行图形操作时,经常需要这种东西[这种操作需要呈现为离散像素,并且应以这样的方式进行四舍五入,以使适用于+/-(2 ^ 31-1)范围的所有x的round(x)-1 = round(x-1);即使对此类操作进行了四舍五入,也应使用Floor(x + 0.5),而不要四舍五入以确保上述属性。

顺便说一句,在C#中,使用(type)expr表示法从Double到Int的类型转换使用从零到零的语义。这与VB.NET行为不同的事实表明,一种或两种语言都在使用自己的转换例程,而不是框架中包含的显式转换运算符。框架似乎应该定义一个转换运算符?框架中是否存在这样的运算符?它有什么作用?有没有办法从C#和/或VB.NET调用它?

相关讨论 出于好奇,我没有回答您的问题:Convert.ToInt32使用另一种舍入方法,即银行家的舍入。 @KonradRudolph:感谢您将其作为转换方法提供;不幸的是,它与CInt所使用的方法相同,尽管对于用C#编写的代码而言可能会有所帮助。 啊,我以为(不检查)CInt的取整为零,而不是截断或取整。无论如何,就像我说的那样,这不是答案。我想不出任何一种方法可以在VB中一步实现C#的(int)强制转换(这并不意味着没有办法)。 @KonradRudolph:其实,我想要的是舍入到负无穷大。使用四舍五入的图形例程通常在零处有一个可见的异常,而使用四舍五入的那些例程有时每两个像素有一个异常(因为四舍五入后的序列为(0.5 1.5 2.5 3.5))变为(0 2 2 4 )。在许多情况下,舍入到负无穷显然很有用;我想知道各种图形例程是否使用自己的内部方法,或者它们将做什么?

经过一番搜索之后,似乎VB缺少编写扩展方法的干净方法。

C#(int)强制转换直接转换为IL中的conv.i4。 VB没有此类运算符,并且似乎没有框架功能可以提供替代方案。

Usenet在2005年就此进行了有趣的讨论-当然,此后发生了很多变化,但我认为这仍然成立。

相关讨论 我想知道为什么Microsoft不会一直都在vb或Framework中添加一些方法[因此,图形例程之类的东西如何处理此问题]?从浮点到整数值的非四舍五入转换似乎并不是一个晦涩的操作。 他们使用Fix()函数。我的回答如下。 @Undefined否。我的答案中的链接已经提到了Fix,但同时也提到了为什么它不满足OP的要求。简而言之,Fix返回错误的类型,您仍然需要转换为Integer,与问题本身中提到的功能相同。 强制转换不是操作问题,四舍五入是操作问题。 Fix返回一个双精度数,但它是一个整数,不四舍五入。本质上是整数。 @Undefined废话。 OP需要CInt(Int(x))的语义(而不是CInt(Fix(x))!的语义!),但更简洁。铸造绝对是问题的一部分。 OP在问题中如此明确地说,然后在您的答案下方的评论中如此明确地说。 麻烦您参考标题:"将Double或Single转换为Integer而不舍入的最简单方法" 用你自己的话说:"经过一番搜索,似乎VB没有干净的方法来实现这一目标,除非编写扩展方法。"但是你错了,确实如此。那就是我的意思。 @Undefined好,我咬一口。有什么办法?你为什么不显示它? DIM KonradRudolph AS Double = 0.8 KonradRudolph = Cint(Fix(KonradRudolph)与您的陈述相反,我提供了一种"干净的实现方法...未编写扩展方法。"强制转换是非常标准的一种好的做法,并且在选件中需要严格:不允许对不同类型使用隐式转换,如果使用Option Strict,则必须进行强制转换,任何值得他坚持的开发人员都将始终使用。 @Undefined,老实说,我不明白为什么这很难理解:(1)OP希望结果??以Integer而不是Double表示。 (2)OP希望一种方法仅使用一个函数调用/广播,而不是两个。 OP明确不想写CInt(Int(x))(也不想写CInt(Fix(x)),对于本次讨论的目的是相同的)。 我也不知道为什么,但是无论如何你都会继续做下去。你说没办法但是还有。我不在乎OP是否要使用强制转换,您必须在Option Strict中使用强制转换。否则别无选择。故事结局。 @未定义"必须使用强制转换" —是的,这正是我的回答。特别是,我的回答是,没有VB.NET方法或运算符直接公开conv.i4 IL代码,这与C#不同,在C#中,此操作由(int)强制转换公开。

您可以使用Math.Truncate方法。

Calculates the integral part of a specified double-precision floating-point number.

例如:

12Dim a As double = 1.6666666 Dim b As Integer = Math.Truncate(a) ' b = 1 相关讨论 Math.Truncate产生类型为Double的结果;没有Option Strict Off,以上内容将无法编译。 Int函数产生所需的数值行为,如果我想使用Option Strict Off会很好,但是该设置使vb.net成为一种非常古怪的语言。 您说得很对,Option Strict Off不好。我没有注意到我的VS auto在创建控制台应用程序时就这样说(否则我会看到警告)。

我知道这是一个旧案例,但是我没有人建议使用Math.Round()函数。

是的Math.Round取一个双精度值并返回一个双精度值。但是,它返回的数字已四舍五入为整数。它应该使用cInt轻松,简洁地转换为整数。这样就够了吗?

cInt(math.round(10000.54564))'= 10001 cInt(math.round(10000.49564))'= 10000

正确的答案是使用MSDN详细介绍的VB.NET的Fix()函数。

https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.visualbasic.conversion.fix?view=netcore-3.1

在Option Strict On上使用Fix();没有隐式转换

123DIM a as double = 1.69 DIM b as integer = cInt(a) ' Returns 2 due to rounding. DIM c as integer = cInt(Fix(a)) ' Returns 1 (whole number, without rounding)

要在选项严格关闭的情况下使用Fix();允许隐式转换

123DIM a as double = 1.69 DIM b as integer = a ' Returns 2 due to rounding DIM c as integer = Fix(a) ' Returns 1 (whole number, without rounding)

相关讨论 返回Int32的Fix的唯一重载是采用Int32参数的重载。我很好奇这些服务的目的是什么。 再次查看过载。 Fix()能够处理Int16,Int32,Int64,Single,Double的类型。这些类型的唯一区别是它们可以容纳的容量,int32可以容纳大约45亿个数字,这在大多数用例中都绰绰有余。 Int64更高,超过了Fix()仍可以处理的五百亿。但是谢谢你的反对。 拒绝投票不是我的意思,但是再看一遍,我发现文档毫无意义。 Int32 Fix(Int32)重载下的示例传递了Double(将使用Double Fix(Double)重载),但是随后将结果存储到Integer中,这需要使用严重损坏的Option Strict Off方言。 OP正在寻找CInt(Int(FloatingPointVar))的"简洁而惯用"替代方案。明确指出的您的建议是CInt(Fix(FloatingPointVar)),它不会更短而且绝对不是惯用语,并且返回的结果与Int不同。 因为OP不需要ROUNDING。 ROUNDING是OP的问题,不是他是否可以转换,OP不会试图避免自己再输入5个额外字符,OP需要从DBL获取INT而不进行舍入。 DIM x作为整数= 1.69将返回2。DIM x作为整数= cInt(Fix(1.69))返回1。此外,您可以在VS2019,Core和Framework中在Option Strict On上完全使用Fix()。您不能做的是隐式转换,因此您不能说DIM x为整数= Fix(number);您必须将DIM x做为整数= CINT(Fix(number))...但绝对100%可在Option Strict On下使用。

您可能需要提取浮点数的Int部分:

1234float num = 12.234; string toint ="" + num; string auxil = toint.Split('.'); int newnum = Int.Parse(auxil[0]);

相关讨论 请不。不要通过将数字转换为字符串然后返回来执行算术运算。这是低效率的,不必要的并且在逻辑上令人费解。 这与"最干净的转换方式..."如何兼容? 最糟糕,最不高效的方法。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3